package com.gitee.cashzhang27.test.boot.functional.properties;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import org.redisson.config.ReadMode;
import org.redisson.config.SubscriptionMode;
import org.redisson.connection.balancer.LoadBalancer;
import org.redisson.connection.balancer.RoundRobinLoadBalancer;

/**
 * Redisson 基础主从属性.
 *
 * @author Cash Zhang
 * @version v1.0 2020/09/17 17:32
 * @since v1.0
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = false)
public class RedissonBaseMasterSlaveServerProperties extends RedissonBasePatternProperties {

  /**
   * 负载均衡算法类的选择.
   * 默认值： org.redisson.connection.balancer.RoundRobinLoadBalancer
   * 在使用多个Redis服务节点的环境里，可以选用以下几种负载均衡方式选择一个节点：
   * org.redisson.connection.balancer.WeightedRoundRobinBalancer - 权重轮询调度算法
   * org.redisson.connection.balancer.RoundRobinLoadBalancer - 轮询调度算法
   * org.redisson.connection.balancer.RandomLoadBalancer - 随机调度算法
   */
  private LoadBalancer loadBalancer = new RoundRobinLoadBalancer();

  /**
   * 从节点最小空闲连接数.
   * 默认值：32
   * 多从节点的环境里，每个 从服务节点里用于普通操作（非 发布和订阅）的最小保持连接数（长连接）
   * 长期保持一定数量的连接有利于提高瞬时读取反映速度。
   */
  private int slaveConnectionMinimumIdleSize = 32;

  /**
   * 从节点连接池大小.
   * 默认值：64
   * 多从节点的环境里，每个 从服务节点里用于普通操作（非 发布和订阅）连接的连接池最大容量
   * 连接池的连接数量自动弹性伸缩。
   */
  private int slaveConnectionPoolSize = 64;

  /**
   * 从节点剔除后重试时间，单位：毫秒.
   * 默认值：3秒
   * 当从可用服务器的内部列表中排除时，Redis Slave重新连接尝试的间隔，单位：毫秒.
   */
  private int failedSlaveReconnectionInterval = 3000;

  /**
   * 从节点执行命令失败剔除时间，单位：毫秒.
   * 默认值：10秒
   * 当此服务器上的第一次Redis命令执行失败的时间间隔达到 failedSlaveCheckInterval 值时，
   * 将从可用节点的内部列表中排除无法执行命令的Redis从节点.
   */
  private int failedSlaveCheckInterval = 180000;

  /**
   * 主节点最小空闲连接数.
   * 默认值：32
   * 多从节点的环境里，每个 主节点的最小保持连接数（长连接）
   * 长期保持一定数量的连接有利于提高瞬时写入反应速度。
   */
  private int masterConnectionMinimumIdleSize = 32;

  /**
   * 主节点连接池大小.
   * 默认值：64
   * 主节点的连接池最大容量。连接池的连接数量自动弹性伸缩
   */
  private int masterConnectionPoolSize = 64;

  /**
   * 读取操作的负载均衡模式.
   * 默认值： SLAVE（只在从服务节点里读取）
   * 注：在从服务节点里读取的数据说明已经至少有两个节点保存了该数据，确保了数据的高可用性。
   * 设置读取操作选择节点的模式。
   * 可用值为：
   * SLAVE - 只在从服务节点里读取。
   * MASTER - 只在主服务节点里读取。
   * MASTER_SLAVE - 在主从服务节点里都可以读取。
   */
  private ReadMode readMode = ReadMode.SLAVE;

  /**
   * 订阅操作的负载均衡模式.
   * 默认值：SLAVE（只在从服务节点里订阅）
   * 设置订阅操作选择节点的模式。
   * 可用值为：
   * SLAVE - 只在从服务节点里订阅。
   * MASTER - 只在主服务节点里订阅。
   */
  private SubscriptionMode subscriptionMode = SubscriptionMode.MASTER;

  /**
   * 从节点发布和订阅连接的最小空闲连接数.
   * 默认值：1
   * 多从节点的环境里，每个 从服务节点里用于发布和订阅连接的最小保持连接数（长连接）
   * Redisson内部经常通过发布和订阅来实现许多功能。长期保持一定数量的发布订阅连接是必须的。
   */
  private int subscriptionConnectionMinimumIdleSize = 1;

  /**
   * 从节点发布和订阅连接池大小.
   * 默认值：50
   * 多从节点的环境里，每个 从服务节点里用于发布和订阅连接的连接池最大容量
   * 连接池的连接数量自动弹性伸缩
   */
  private int subscriptionConnectionPoolSize = 50;

  /**
   * DNS监控间隔，单位：毫秒
   * 默认值：5秒
   * 用来指定检查节点DNS变化的时间间隔.
   * 使用的时候应该确保JVM里的DNS数据的缓存时间保持在足够低的范围才有意义。用-1来禁用该功能.
   */
  private long dnsMonitoringInterval = 5000;

}
